// shell 通道 用开打开第三方一些应用程序的
import { AsyncLocalStorage } from 'async_hooks' // 异步钩子函数
import { BACKBONE_DEBUGGER } from 'electron-devtools-installer'
const koa = require('koa')
const Router = require('koa-router')
const fs = require('fs') // node原生模块 文件处理
const os = require('os') // node原生模块
const path = require('path') // node原生模块
const koa_static = require('koa-static-server')
const koaBody = require('koa-body') // koa body中间件
const logger = require('koa-logger') // log日志插件
const low = require('lowdb')
const FileSync = require('lowdb/adapters/FileSync')
const regedit = require('regedit') // 注册表模块
// 正式环境配置注册表读取脚本路径
process.env.NODE_ENV !== 'development' && regedit.setExternalVBSLocation('./resources/vbs')

const cp = require('child_process')

const app = new koa()
const router = new Router()

app.use(logger()) // 过程日志生成

// 设置返回体大小限制
app.use(koaBody({
  jsonLimit: '10kb', // json传输大小 10kb限制
  multipart: true, // 文件上传时候支持多文件上传
  formidable: {
    keepExtensions: true, // 保持文件的后缀
    maxFieldsSize: 20 * 1024 * 1024, // 文件上传大小 最大限制20M
    onFileBegin: (name, file) => { // 文件上传前的设置
      console.log(`name: ${name}`)
      console.log(file)
    }
  }
}))

// 404 页面
app.use(async function (ctx, next) {
  await next()
  if (ctx.body || !ctx.idempotent) return
  ctx.redirect('/404')
})

// 配置静态文件访问地址
app.use(koa_static({
  rootDir: path.join(__dirname, '../../../static/'), // 实际静态文件的存放地址
  rootPath: '/static/'
}))

// 错误处理
app.use(async function (ctx, next) {
  try {
    await next()
  } catch (err) {
    // 一些错误是自带status属性
    ctx.status = err.status || 500
    ctx.type = 'html'
    ctx.body = '<p>Something <em>exploded</em>, please contact Maru.</p>'
    // 触发事件
    ctx.app.emit('error', err, ctx)
  }
})

// 配置跨域请求
app.use(async (ctx, next) => {
  ctx.set('Access-Control-Allow-Origin', '*')
  ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild')
  ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS')
  if (ctx.method == 'OPTIONS') {
    ctx.body = 200
  } else {
    await next()
  }
})

// 随机ID 生成
function uid () {
  return Math.random().toString(16).slice(2)
}

// 监听错误事件
app.on('error', function (err) {
  if (process.env.NODE_ENV != 'test') {
    console.log('sent error %s to the cloud', err.message)
    console.log(err)
  }
})

// 获取注册表
async function getRegedit (key) {
  return new Promise(resolve => {
    regedit.list(key, function (err, result) {
      console.log('获取到注册表的信息', result[key])
      resolve(result[key])
    })
  })
}

// 打开IE
async function openIE (url) {
  return new Promise(resolve => {
    cp.exec('start iexplore ' + url, function (err, stdout, stderr) {
      if (err) {
        resolve(false)
      } else {
        resolve(true)
      }
    })
  })
}

// 打开谷歌
async function openChrome (url, chromePath) {
  return new Promise(resolve => {
    fs.stat(chromePath, function (err) {
      if (err) {
        return openIE(url)
      } else {
        cp.exec('start chrome ' + url, function (err, stdout, stderr) {
          if (err) {
            return openIE(url)
          } else {
            resolve(true)
          }
        })
      }
    })
  })
}

// 打开谷歌浏览器
router.post('/openChrome', async (ctx) => {
  let url = ctx.request.body.url
  console.log('打开谷歌浏览器操作开始，参数', url)
  let address = await getRegedit('HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Google Chrome')
  if (!address) {
    ctx.body = errRes('谷歌浏览器打开失败！', null)
  } else {
    let chromeAddress = address.values.InstallLocation.value + '\\chrome.exe'
    let openFlag = await openChrome(url, chromeAddress)
    if (openFlag) {
      ctx.body = successRes('谷歌浏览器打开成功！', null)
    } else {
      ctx.body = errRes('谷歌浏览器打开失败，已尝试使用IE打开！', null)
    }
  }
})


// 404页面
router.get('/404', async (ctx) => {
  ctx.type = 'html'
  ctx.body = '<p>页面找不到了404！</p>'
})

// 错误信息 统一展示
function errRes (msg = '请求错误') {
  return {
    code: 'err',
    createTime: new Date().getTime(),
    msg: msg
  }
}

// 成功信息 统一展示
function successRes (msg = '请求成功', data) {
  return {
    code: 'ok',
    createTime: new Date().getTime(),
    msg: msg,
    data: data
  }
}

// 启用路由
app.use(router.routes())

// 开启后台服务
let server = app.listen('9082', function () {
  console.log('shell server running is http://localhost:9082')
})
